/*
 * gpio.h
 *
 * Created: 2013-11-5 7:50:01
 *  Author: alivehex
 */ 


#ifndef GPIO_H_
#define GPIO_H_

#define _io_input_hiz(n, mask)		DDR##n &= ~(mask);	PORT##n &= ~(mask)
#define _io_input_pp(n, mask)		DDR##n &= ~(mask);	PORT##n |= (mask)
#define _io_output_low(n, mask)		DDR##n |= (mask);	PORT##n &= ~(mask)
#define _io_output_high(n, mask)	DDR##n |= (mask);	PORT##n |= (mask)
#define _io_set(n, mask)			PORT##n |= (mask)
#define _io_clr(n, mask)			PORT##n &= ~(mask)
#define _io_inv(n, mask)			PORT##n ^= (mask)
#define _io_get(n, mask)			((PIN##n & (mask)) ? 1 : 0)

#define io_input_hiz(n, mask)		_io_input_hiz(n, mask)
#define io_input_pp(n, mask)		_io_input_pp(n, mask)
#define io_output_low(n, mask)		_io_output_low(n, mask)
#define io_output_high(n, mask)		_io_output_high(n, mask)
#define io_set(n, mask)				_io_set(n, mask)
#define io_clr(n, mask)				_io_clr(n, mask)
#define io_inv(n, mask)				_io_inv(n, mask)
#define io_get(n, mask)				_io_get(n, mask)


#define CONFIG_IO_HIZ(PORTX, PINX) \
	DDR##PORTX &= ~(PINX); \
	PORT##PORTX &= ~(PINX)
	
#define CONFIG_IO_INPUT_PULLUP(PORTX, PINX) \
	DDR##PORTX &= ~(PINX); \
	PORT##PORTX |= (PINX)
	
#define CONFIG_IO_OUTPUT(PORTX, PINX) \
	DDR##PORTX |= (PINX)
	
#define SET_IO(PORTX, PINX) \
	PORT##PORTX |= (PINX)
	
#define CLR_IO(PORTX, PINX) \
	PORT##PORTX &= ~(PINX)
	
#define GET_IO(PORTX, PINX) \
	PIN##PORTX & (PINX)

#define GET_IO2(PORTX, PINX) \
	((PIN##PORTX & (PINX) ? 1 : 0))
	
#define _PORT(XX)	PORT##XX

#define _PORT_(XX)	_PORT(XX)

#define _DDR(XX)	PORT##XX

#define _DDR_(XX)	_DDR(XX)
	
#define _CONFIG_IO_HIZ(XX, YY)			CONFIG_IO_HIZ(XX, YY)
#define _CONFIG_IO_INPUT_PULLUP(XX, YY)	CONFIG_IO_INPUT_PULLUP(XX, YY)
#define _CONFIG_IO_OUTPUT(XX, YY)		CONFIG_IO_OUTPUT(XX, YY)
#define _SET_IO(XX, YY)					SET_IO(XX, YY)
#define _CLR_IO(XX, YY)					CLR_IO(XX, YY)
#define _GET_IO(XX, YY)					GET_IO(XX, YY)
#define _GET_IO2(XX, YY)				GET_IO2(XX, YY)

#endif /* GPIO_H_ */